#include "wave_analysis.h"
#include "systick.h"
#include "gd32f310_bsp_adc.h"

#define RISE_INCREMENTAL 1
#define RISE_THRESHOLD 20
#define RISE_TIMES 5

#define FALL_THRESHOLD 50
#define FALL_TIMES 5

uint16_t adc_value_raw_last[ADC_CHANNELS];

uint16_t result_buffer[10];
uint16_t falling_cnt = 0;
uint16_t trigger_cnt = 0;
uint16_t trigger_point_cnt = 0;
uint16_t adc_value_max = 0;
uint16_t num_of_bullet = 0;
uint32_t temp_time[3] = {0};
uint16_t number_of_point = 0;
uint16_t time_of_wave = 0;
uint8_t wave_detect_stage = 0;

void wave_analysis(void)
{
    switch (wave_detect_stage)
    {
    case 0:
    {
        // 触发条件：连续上升，每次采样上升值大于2，持续5次
        if ((adc_value_raw[0] - adc_value_raw_last[0]) > RISE_INCREMENTAL && adc_value_raw[0] > RISE_THRESHOLD)
        {
            trigger_cnt++;
        }
        else
        {
            trigger_cnt = 0;
        }
        if (trigger_cnt > RISE_TIMES)
        {
            trigger_cnt = 0;
            temp_time[1] = sys_us_get();
            adc_value_max = 0;
            wave_detect_stage = 1;
        }
        break;
    }
    case 1:
    {
        trigger_point_cnt++;

        // 找到本次窗口的最大值
        if (adc_value_raw[0] > adc_value_max)
        {
            adc_value_max = adc_value_raw[0];
        }

        // 结束条件，采样值小于50，连续10次
        if ((adc_value_raw[0]) < FALL_THRESHOLD)
        {
            falling_cnt++;
        }
        else
        {
            falling_cnt = 0;
        }
        if (falling_cnt > FALL_TIMES)
        {
            falling_cnt = 0;
            wave_detect_stage = 2;
        }
        break;
    }
    case 2:
    {
        temp_time[2] = sys_us_get();
        temp_time[0] = temp_time[2] - temp_time[1];

        number_of_point = trigger_point_cnt;
        // time_of_wave = number_of_point * 42;
        time_of_wave = temp_time[0];

        trigger_point_cnt = 0;
        num_of_bullet++;

        for (int i = 4; i >= 1; i--)
        {
            result_buffer[i] = result_buffer[i - 1];
        }
        result_buffer[0] = adc_value_max;

        wave_detect_stage = 0;
        break;
    }
    default:
        break;
    }

    adc_value_raw_last[0] = adc_value_raw[0];
}

// if (trigger_flag == 1)
// {
//     trigger_point_cnt++;

//     if (adc_value_raw[0] > adc_value_max)
//     {
//         adc_value_max = adc_value_raw[0];
//     }

//     // 40us 一次，100ms的窗口 100*1000/40 = 2500个点
//     //            if (trigger_point_cnt > 2500 * 3)

//     if ((adc_value_raw[0]) < 50)
//     {
//         falling_cnt++;
//     }
//     else
//     {
//         falling_cnt = 0;
//     }

//     if (falling_cnt > 10)
//     {
//         falling_flag = 1;
//     }

//     // if ((temp_time[2] > 1000 * 300) || falling_flag == 1)
//     if (falling_flag == 1)
//     {
//         temp_time[1] = sys_us_get();
//         temp_time[2] = temp_time[1] - temp_time[0];

//         number_of_point = trigger_point_cnt;
//         time_of_wave = number_of_point * 42;

//         falling_flag = 0;
//         trigger_point_cnt = 0;
//         trigger_flag = 0;
//         oled_refresh_flag = 1;
//         num_of_bullet++;

//         for (int i = 4; i >= 1; i--)
//         {
//             result_buffer[i] = result_buffer[i - 1];
//         }
//         result_buffer[0] = adc_value_max;
//     }

//     // adc_record_buf[adc_record_idx] = adc_value_raw[0];
//     // adc_record_idx++;
//     // if (adc_record_idx >= 2000)
//     // {
//     //     adc_record_idx = 0;
//     //     trigger_flag = 0;
//     //     oled_refresh_flag = 1;
//     // }
// }

// // adc_trans_cnt++;